/*
 * Serializer.h
 *
 *  Created on: Oct 10, 2011
 *      Author: kimi
 */

#ifndef SERIALIZER_H_
#define SERIALIZER_H_

/*
 * Serializador.h
 *
 *  Created on: Sep 11, 2011
 *      Author: kimi
 */

#ifndef SERIALIZADOR_H_
#define SERIALIZADOR_H_

#include <iostream>
#include <string>
#include <algorithm>
#include <fstream>

using namespace std;

class Serializador {
public:
	void reset();
	void clear();
	void delete_internal_buffer();
	unsigned int length();

	template<typename T> bool operator >>(T& output) {
		return leer(output);
	}
	template<typename T> bool operator <<(T& output) {
		return escribir(output);
	}

	bool leer(char& _char);
	bool leer(int& _int);
	bool leer(unsigned int& _uint);
	bool leer(unsigned long& _uint);
	bool leer(float& _float);
	bool leer(double& _double);
	bool leer(std::string& _str);

	bool escribir(const char& _char);
	bool escribir(const int& _int);
	bool escribir(const unsigned int& _uint);
	bool escribir(const unsigned long& _uint);
	bool escribir(const float& _float);
	bool escribir(const double& _double);
	bool escribir(std::string& _str);
	bool escribir(const char* data, unsigned int length);

	void escribir_en_stream(std::ofstream& stream);
	void leer_de_stream(std::ifstream& stream, const unsigned int length);

	void escribir_en_buffer(char data[]);
	void leer_de_buffer(const char data[], const unsigned int& length);

	Serializador(char* buffer, const unsigned int& buffer_length);
private:

	Serializador& operator=(const Serializador& s);

	template<typename T>
	bool escribir_impl(const T& data);

	template<typename T>
	bool leer_impl(T& data);


	char* original_buffer_;
	char* buffer_;
	unsigned int buffer_length_;
	unsigned int tamanio_buffer_escritura;
	unsigned int tamanio_buffer_lectura;
};

#endif /* SERIALIZADOR_H_ */


#endif /* SERIALIZER_H_ */
